/**
 * Copyright (C) 2020-2021   江西省农村信用社联合社
 * All rights reserved
 */
package com.liuyucheng.util;

import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 对"空"的判断公共方法
 *
 * @author Chenshili
 */
public class EmptyUtil {

    /**
     * 判断Object是否不为空,先判断是否不为null，为null返回false;不为null 继续判断toString()是否不为空
     *
     * @author LiuJun
     */
    public static <T> boolean isNotEmpty(Object value) {
        return NullUtil.isNotNull(value) && !(EmptyUtil.isEmpty(value.toString()));
    }

    /**
     * 判断list是否不为空
     *
     * @author LiuJun
     */
    public static <T> boolean isNotEmpty(List<T> lists) {
        return NullUtil.isNotNull(lists) && !(lists.isEmpty());
    }

    /**
     * 判断数组是否不为空
     *
     * @author LiuJun
     */
    public static <T> boolean isNotEmpty(T[] datas) {
        return NullUtil.isNotNull(datas) && (datas.length > 0);
    }

    /**
     * 判断字符串是否不为空
     *
     * @author LiuJun
     */
    public static boolean isNotEmpty(String datas) {
        if (NullUtil.isNotNull(datas)) {
            if ("".equals(datas.trim())) {
                return false;
            } else if (StringUtils.isBlank(datas)) {
                return false;
            }
            return true;
        }
        return false;
    }

    /**
     * 判断Map是否不为空
     *
     * @author LiuJun
     */
    @SuppressWarnings("rawtypes")
    public static boolean isNotEmpty(Map datas) {
        return MapUtils.isNotEmpty(datas);
    }

    /**
     * 判断字符串不能为空，且不能为“undefined”，主要是在js选择后验证，可以调用此方法
     *
     * @author LiuJun
     */
    public static boolean isNotUndefinedChars(String value) {
        return isNotEmpty(value) && !"undefined".equals(value.trim().toLowerCase());
    }

    /**
     * 判断字符串不能为空，且不能为“null”，主要是在js选择后验证，可以调用此方法
     *
     * @author LiuJun
     */
    public static boolean isNotNullChars(String value) {
        return isNotEmpty(value) && !"null".equals(value.trim().toLowerCase());
    }

    /**
     * 判断字符串不能为空，且不能为“null”和“undefined”，主要是在js选择后验证，可以调用此方法
     *
     * @author LiuJun
     */
    public static boolean isNotEmptyChars(String value) {
        return isNotUndefinedChars(value) && isNotNullChars(value);
    }

    /**
     * 判断list是否为空
     *
     * @author LiuJun
     */
    public static <T> boolean isEmpty(List<T> lists) {
        if (NullUtil.isNull(lists)) {
            return true;
        } else if (lists.isEmpty()) {
            return true;
        }
        return false;
    }

    /**
     * 判断数组是否为空
     *
     * @author LiuJun
     */
    public static <T> boolean isEmpty(T[] datas) {
        if (NullUtil.isNull(datas)) {
            return true;
        } else if (datas.length == 0) {
            return true;
        }
        return false;
    }

    /**
     * 判断字符串是否为空
     *
     * @author LiuJun
     */
    public static boolean isEmpty(String datas) {
        if (NullUtil.isNull(datas)) {
            return true;
        } else if ("".equals(datas.trim())) {
            return true;
        } else if (StringUtils.isBlank(datas)) {
            return true;
        }
        return false;
    }

    /**
     * 判断Map是否为空
     *
     * @author LiuJun
     */
    @SuppressWarnings("rawtypes")
    public static boolean isEmpty(Map datas) {
        return MapUtils.isEmpty(datas);
    }

    /**
     * 判断字符串为空，或为“undefined”，主要是在js选择后验证，可以调用此方法
     *
     * @author LiuJun
     */
    public static boolean isUndefinedChars(String value) {
        if (isEmpty(value)) {
            return true;
        } else if ("undefined".equals(value.trim().toLowerCase())) {
            return true;
        }
        return false;
    }

    /**
     * 判断字符串为空，或为“null”，主要是在js选择后验证，可以调用此方法
     *
     * @author LiuJun
     */
    public static boolean isNullChars(String value) {
        if (isEmpty(value)) {
            return true;
        } else if ("null".equals(value.trim().toLowerCase())) {
            return true;
        }
        return false;
    }

    /**
     * 判断字符串为空，或为“null”和“undefined”，主要是在js选择后验证，可以调用此方法
     *
     * @author LiuJun
     */
    public static boolean isEmptyChars(String value) {
        return isNullChars(value) || isUndefinedChars(value);
//		if (isNullChars(value) || isUndefinedChars(value)) {
//			return true;
//		}
//		return false;
    }

    /**
     * 判断Object是否不为空,先判断是否不为null，为null返回false;不为null 继续判断toString()是否不为空
     *
     * @author LiuJun
     */
    public static <T> boolean isEmpty(Object value) {
        if (NullUtil.isNull(value)) {
            return true;
        } else if (EmptyUtil.isEmpty(value.toString())) {
            return true;
        }
        return false;
    }

    /**
     * 获取BigDecimal
     * @return
     */
    public static BigDecimal toBigDecimal(Object object){
        if(object==null || "".equals(object)){
            return BigDecimal.ZERO;
        }else{
            return new BigDecimal(object.toString());
        }
    }

    /**
     * 获取int
     * @return
     */
    public static int toInteger(Object object){
        if(object==null || "".equals(object)){
            return 0;
        }else{
            try{
                return Integer.parseInt(object.toString());
            }catch (Exception e){
                return 0;
            }
        }
    }

    /**
     * 返回判空后的字符串
     * @param object
     * @return
     */
    public static String delNull(Object object){
        if(isEmpty(object)){
            return "";
        }
        return object.toString();
    }

    /**
     * 移除字符串两侧空格
     * @param str
     * @return
     */
    public static String trim(String str){
        if(str==null){
            return "";
        }
        return str.trim();
    }

    /**
     * 将账单文件中的数字转换为BigDecimal
     * @param str
     * @return
     */
    public static BigDecimal getFileDecimal(String str){
        if(isEmpty(str)){
            return BigDecimal.ZERO;
        }
        return new BigDecimal(str).divide(new BigDecimal(100),2,BigDecimal.ROUND_HALF_UP);
    }

}
